package com.drg.center.controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.alibaba.fastjson.JSONObject;
import com.drg.center.entity.param.SysOssPresignedDTO;
import com.guaike.core.entity.result.Result;
import com.guaike.core.utils.VerifyCodeGenerateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.FileStorageService;
import org.dromara.x.file.storage.core.constant.Constant;
import org.dromara.x.file.storage.core.presigned.GeneratePresignedUrlResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Random;

/**
 * @Author: zhangxilin
 * @Date: 2024/10/30
 */
@Slf4j
@RestController
@RequestMapping("/oss")
@Api(tags = "系统-OSS相关接口组")
public class SysAliOssController {

    @Autowired
    private FileStorageService fileStorageService;

    @PostMapping("/generatePresignedUrl")
    @ApiOperation(value = "预签名URL")
    public Result<GeneratePresignedUrlResult> generatePresignedUrl(@Valid @RequestBody SysOssPresignedDTO param){
        GeneratePresignedUrlResult uploadResult = fileStorageService
                .generatePresignedUrl()
                .setPath(buildUploadKey())
                .setMethod(Constant.GeneratePresignedUrl.Method.PUT)
                .setExpiration(DateUtil.offsetMinute(new Date(), 3))
                // 设置保存的文件名
                .setFilename(param.getFileName())
                .putHeadersAll(!CollectionUtils.isEmpty(param.getHeaders()), param.getHeaders())
                .putUserMetadataAll(!CollectionUtils.isEmpty(param.getUserMetadata()), param.getUserMetadata())
                .putQueryParamsAll(!CollectionUtils.isEmpty(param.getQueryParams()), param.getQueryParams())
                .putResponseHeadersAll(!CollectionUtils.isEmpty(param.getResponseHeaders()), param.getResponseHeaders())
                .generatePresignedUrl();
             log.warn("生成上传预签名 URL 结果：{}, param: {}", uploadResult, JSONObject.toJSONString(param));
            return Result.success().data(uploadResult).build();
    }

    private static String buildUploadKey() {
        return LocalDateTimeUtil.format(LocalDateTime.now(), "yyyyMMddHHmmssSSS")  + VerifyCodeGenerateUtil.getRandomNum(4)+"/";

    }



//    @GetMapping("/upload")
//    @ApiOperation(value = "测试服务端直传")
//    public Result<String > upload(){
//        File file = new File("C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg");
//        FileInfo fileInfo = fileStorageService.of(file).upload();
//        log.info("上传结果: {}", fileInfo);
//        return Result.success().data(fileInfo.getUrl()).build();
//    }
//    @PostMapping("/uploadFromCilent")
//    @ApiOperation(value = "测试客户端上传")
//    public Result<String > uploadFromCilent(@Valid @RequestBody TestDTO param){
//        File file = new File("C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg");
//        byte[] bytes =  FileUtil.readBytes(file);
//        HttpResponse httpResponse = HttpUtil.createRequest(Method.PUT, param.getUrl()).addHeaders(param.getMap()).body(bytes).execute();
//
//        log.info("上传结果: {}", httpResponse);
//        return Result.success().data(httpResponse).build();
//    }
//
//    @GetMapping("/generatePresignedUrlBySdk")
//    @ApiOperation(value = "预签名URL(阿里SDK)")
//    public Result generatePresignedUrl2(){
//        // 以华东1（杭州）的外网Endpoint为例，其它Region请按实际情况填写。
//        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//        String accessKeyId = "LTAI5t64puRexg8PG7biW8yG";
//        String accessKeySecret = "SYADuX0M2j76a0tDA5JMkqmvPwxQZ3";
//        // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        CredentialsProvider credentialsProvider  =new DefaultCredentialProvider(accessKeyId, accessKeySecret);
//        // 填写Bucket名称，例如examplebucket。
//        String bucketName = "sscw-admin";
//        // 填写Object完整路径，例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
////        String objectName = "C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg";
//        // 填写Bucket所在地域。以华东1（杭州）为例，Region填写为cn-hangzhou。
//        String region = "cn-hangzhou";
//        String objectName = "pppp.jpg";
//
//        // 创建OSSClient实例。
//        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
//        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
//        OSS ossClient = OSSClientBuilder.create()
//                .endpoint(endpoint)
//                .credentialsProvider(credentialsProvider)
//                .clientConfiguration(clientBuilderConfiguration)
//                .region(region)
//                .build();
//
//        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
//        // 设置签名URL过期时间，单位为毫秒。本示例以设置过期时间为1小时为例。
//        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000L);
//        request.setExpiration(expiration);
//        // 设置ContentType。
//        request.setContentType("text/plain");
//
//        // 生成签名URL。
//        URL signedUrl = ossClient.generatePresignedUrl(request);
//        System.out.println(signedUrl);
//        return Result.success().data(signedUrl).build();
//    }
//
//    @PostMapping("/uploadByAliSdk")
//    @ApiOperation(value = "通过阿里SDK上传")
//    public Result upload2(@Valid @RequestBody TestDTO param) throws Exception{
//
//        // 以华东1（杭州）的外网Endpoint为例，其它Region请按实际情况填写。
//        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//        String accessKeyId = "LTAI5t64puRexg8PG7biW8yG";
//        String accessKeySecret = "SYADuX0M2j76a0tDA5JMkqmvPwxQZ3";
//        // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        CredentialsProvider credentialsProvider  =new DefaultCredentialProvider(accessKeyId, accessKeySecret);
//        // 填写Bucket名称，例如examplebucket。
//        String bucketName = "sscw-admin";
//        // 填写Object完整路径，例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
////        String objectName = "C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg";
//        // 填写Bucket所在地域。以华东1（杭州）为例，Region填写为cn-hangzhou。
//        String region = "cn-hangzhou";
//
//        // 创建OSSClient实例。
//        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
//        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
//        OSS ossClient = OSSClientBuilder.create()
//                .endpoint(endpoint)
//                .credentialsProvider(credentialsProvider)
//                .clientConfiguration(clientBuilderConfiguration)
//                .region(region)
//                .build();
//
//
//        File file = new File("C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg");
//        byte[] bytes =  FileUtil.readBytes(file);
//
//        URL signedUrl = new URL(param.getUrl());
//        // 使用签名URL上传文件。
//        PutObjectResult result = ossClient.putObject(signedUrl, new ByteArrayInputStream(bytes), -1, param.getMap(), true);
//        log.info(">>>>>>>>>>>>>>>>>result: {}", JSONObject.toJSONString(result));
//        return Result.success().data(result).build();
//    }
//
//    @PostMapping("/hangzhou")
//    @ApiOperation(value = "hangzhou")
//    public Result test(){
//        // 以华东1（杭州）的外网Endpoint为例，其它Region请按实际情况填写。
//        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//        String accessKeyId = "LTAI5t64puRexg8PG7biW8yG";
//        String accessKeySecret = "SYADuX0M2j76a0tDA5JMkqmvPwxQZ3";
//        // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        CredentialsProvider credentialsProvider  =new DefaultCredentialProvider(accessKeyId, accessKeySecret);
//        // 填写Bucket名称，例如examplebucket。
//        String bucketName = "sscw-admin";
//        // 填写Object完整路径，例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
////        String objectName = "C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg";
//        // 填写Bucket所在地域。以华东1（杭州）为例，Region填写为cn-hangzhou。
//        String region = "cn-hangzhou";
//        String objectName = "pppp.jpg";
//
//        // 创建OSSClient实例。
//        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
//        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
//        OSS ossClient = OSSClientBuilder.create()
//                .endpoint(endpoint)
//                .credentialsProvider(credentialsProvider)
//                .clientConfiguration(clientBuilderConfiguration)
//                .region(region)
//                .build();
//
//        try {
//            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
//            // 设置签名URL过期时间，单位为毫秒。本示例以设置过期时间为1小时为例。
//            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000L);
//            request.setExpiration(expiration);
//            // 设置ContentType。
//            request.setContentType("text/plain");
//
//
//            // 生成签名URL。
//            URL signedUrl = ossClient.generatePresignedUrl(request);
//            System.out.println(signedUrl);
//
//
//
//            Map<String, String> requestHeaders = new HashMap<String, String>();
//            // 设置ContentType，必须和生成签名URL时设置的ContentType一致。
//            requestHeaders.put(HttpHeaders.CONTENT_TYPE, "text/plain");
//
//
//            File file = new File("C:\\Users\\lenovo\\Desktop\\aiit\\000-LGzTVCgPThca.jpg");
//            byte[] bytes =  FileUtil.readBytes(file);
//
//            // 使用签名URL上传文件。
//            PutObjectResult result = ossClient.putObject(signedUrl, new ByteArrayInputStream(bytes), -1, requestHeaders, true);
//            log.info(">>>>>>>>>>>>>>>>>result: {}", JSONObject.toJSONString(result));
//        } catch (OSSException oe) {
//            System.out.println("Caught an OSSException, which means your request made it to OSS, "
//                    + "but was rejected with an error response for some reason.");
//            System.out.println("Error Message:" + oe.getErrorMessage());
//            System.out.println("Error Code:" + oe.getErrorCode());
//            System.out.println("Request ID:" + oe.getRequestId());
//            System.out.println("Host ID:" + oe.getHostId());
//        } catch (ClientException ce) {
//            System.out.println("Caught an ClientException, which means the client encountered "
//                    + "a serious internal problem while trying to communicate with OSS, "
//                    + "such as not being able to access the network.");
//            System.out.println("Error Message:" + ce.getMessage());
//        } finally {
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }
//        return Result.success().data(Boolean.TRUE).build();
//    }




}
